// ConsoleApplication18.cpp : Defines the entry point for the console application.
/*
Scrivere un programma che permetta il gioco del tris, il gioco ha due modalità:
giocatore vs giocatore e giocatore vs cpu
Menu
*/

#include "stdafx.h"
#include <iostream>
#include <time.h>
#define N 3
#define ZERO 0
using namespace std;

void menu();
void inserisci(char *px, char *po);
void inizializza(char tris[][N]);
void visualizza(char tris[][N]);
void user_vs_user(char x, char o, char tris[][N]);
void user_vs_cpu(char x, char o, char tris[][N]);
int check_xy(char tris[][N], int x, int y);
int check_tris(char tris[][N], int cont);

int main()
{
	srand(time(NULL));
	menu();
	system("pause");
    return 0;
}

void menu()
{
	int scelta;
	char x;
	char o;
	char tris[N][N];
	do
	{
		system("cls");
		printf("1. Inserisci simboli\n");
		printf("2. User VS User\n");
		printf("3. User VS CPU\n");
		scanf_s("%d", &scelta);
		switch (scelta)
		{
		case 1:
			inserisci(&x, &o);
			break;
		case 2:
			user_vs_user(x, o, tris);
			break;
		case 3:
			user_vs_cpu(x, o, tris);
			break;
		}
	} while (scelta != 0);
}

void inserisci(char *px, char *po)
{
	char x;
	char o;
	printf("Inserisci il carattere da usare per il giocatore 1:\n");
	cin >> x;
	printf("Inserisci il carattere da usare per il giocatore 2:\n");
	cin >> o;
	*px = x;
	*po = o;
}

void inizializza(char tris[][N])
{
	int cont = 0;
	for (int j = 0; j < N; j++)
	{
		for (int i = 0; i < N; i++)
		{
			tris[j][i] = (char)48+cont;
			cont++;
		}
	}
}

void visualizza(char tris[][N])
{
	system("cls");
	for (int j = 0; j < N; j++)
	{
		for (int i = 0; i < N; i++)
		{
			printf("%c ", tris[j][i]);
		}
		printf("\n");
	}
}

void user_vs_user(char x, char o, char tris[][N])
{
	inizializza(tris);
	int xn;
	int yn;
	int cont = 0;
	int utente = 1;
	do
	{
		if (cont == (N*N) - 1)
		break;
		visualizza(tris);
		if ((utente == 1) && cont != 0)
			utente = 2;
		else
			utente = 1;
		printf("\nTurno del giocatore %d\n", utente);
		switch (utente)
		{
		case 1:
			do
			{
				printf("X:\n");
				scanf("%d", &xn);
				printf("Y:\n");
				scanf("%d", &yn);
			} while (check_xy(tris, xn, yn) != 0);
			tris[xn][yn] = x;
			check_tris(tris, cont);
			break;
		case 2:
			do
			{
				printf("X:\n");
				scanf("%d", &xn);
				printf("Y:\n");
				scanf("%d", &yn);
			} while (check_xy(tris, xn, yn) != 0);
			tris[xn][yn] = o;
			check_tris(tris, cont);
			break;
		}
		cont++;
	} while (check_tris(tris, cont)==0);
	visualizza(tris);
	printf("Ha vinto l'utente %d\n", utente);
	// printf("Return %d", check_tris(tris, cont));
	system("pause");
}

void user_vs_cpu(char x, char o, char tris[][N])
{
	inizializza(tris);
	int xn;
	int yn;
	int utente = 1;
	int cont = 0;
	do
	{
		if (cont == (N*N) - 1)
			break;
		visualizza(tris);
		if ((utente == 1)&&cont!=0)
			utente = 2;
		else
			utente = 1;
		printf("\nTurno del giocatore %d\n", utente);
		switch (utente)
		{
		case 1:
			do
			{
				printf("X:\n");
				scanf("%d", &xn);
				printf("Y:\n");
				scanf("%d", &yn);
			} while (check_xy(tris, xn, yn) != 0);
			tris[xn][yn] = x;
			check_tris(tris, cont);
			break;
		case 2:
			do
			{
				xn = rand() % N;
				yn = rand() % N;
			} while (check_xy(tris, xn, yn) != 0);
			tris[xn][yn] = o;
			check_tris(tris, cont);
			break;
		}
		cont++;
	} while (check_tris(tris, cont) == 0);
	visualizza(tris);
	printf("Ha vinto l'utente %d\n", utente);
	// printf("Return %d", check_tris(tris, cont));
	system("pause");
}

int check_xy(char tris[][N], int x, int y)
{
	if (x <= ZERO-1)
		return 1;
	else
	if (y <= ZERO-1)
		return 2;
	else
	if (x >= N)
		return 3;
	else
	if (y >= N)
		return 4;
	else
		return 0;
}

int check_tris(char tris[][N], int cont) //Non funziona
{
	for (int j = 0; j < N; j++)
	{
		for (int i = 0; i < N; i++)
		{
			if ((tris[j][i] == tris[j + 1][i]) && (tris[j][i] == tris[j + 2][i]))
				return 1;
			else
			if ((tris[j][i] == tris[j][i + 1]) && (tris[j][i] == tris[j][i + 2]))
				return 2;
			else
			if ((tris[j][i] == tris[j + 1][i + 1]) && (tris[j][i] == tris[j + 2][i + 2]))
				return 3;
			else
			if ((tris[j][i] == tris[N - 1][N - 1]) && (tris[j][i] == tris[N - 2][N - 2]))
				return 4;
			else	
				return 0;
		}
	}
}